#ifndef __RING_BUFFER_H__
#define __RING_BUFFER_H__

#include <stdint.h>

/***************************** 配置区 开始 ************************************/
// 使用大块环形缓冲区数据   (效率高，但是占用资源多)
#define RING_BUFFER_USE_BIG_BLOCK_DATA (0)
/***************************** 配置区 结束 ************************************/

/* 定义返回值 */
#define RING_BUFFER_SUCCESS (0)
#define RING_BUFFER_ERROR   (-1)
/* 定义锁定状态 */
#define RING_BUFFER_UNLOCK (0)
#define RING_BUFFER_LOCK   (1)

/**
 * @brief 环形缓冲区结构体定义
 */
typedef struct {
    uint8_t *buffer;            // 环形缓冲区数据指针
    uint32_t size;              // 环形缓冲区大小
    uint32_t write_index;       // 写入位置
    uint32_t read_index;        // 读取位置
    uint32_t count;             // 环形缓冲区中数据大小
    uint8_t is_locked;          // 环形缓冲区是否被锁定
} ring_buffer_t;

/**
 * @brief 初始化环形缓冲区
 * @param buffer 环形缓冲区结构体指针
 * @param buffer_data 环形缓冲区数据指针
 * @param size 环形缓冲区大小
 * @return RING_BUFFER_SUCCESS 成功，RING_BUFFER_ERROR 失败
 */
int8_t ring_buffer_init(ring_buffer_t *buffer, uint8_t *buffer_data, uint32_t size);

/**
 * @brief 释放环形缓冲区
 * @param buffer 环形缓冲区结构体指针
 * @return none
 */
void ring_buffer_free(ring_buffer_t *buffer);

/**
 * @brief 获取环形缓冲区中可用的数据大小
 * @param buffer 环形缓冲区结构体指针
 * @return 可用的数据大小
 */
int ring_buffer_available(ring_buffer_t *buffer);

/**
 * @brief 向环形缓冲区写入数据
 * @param buffer 环形缓冲区结构体指针
 * @param data 数据指针
 * @param size 数据大小
 * @return RING_BUFFER_SUCCESS 成功，RING_BUFFER_ERROR 失败
 */
int ring_buffer_write(ring_buffer_t *buffer, const uint8_t *data, uint32_t size);

/**
 * @brief 从环形缓冲区读取数据
 * @param buffer 环形缓冲区结构体指针
 * @param data 数据指针
 * @param size 数据大小
 * @return RING_BUFFER_SUCCESS 成功，RING_BUFFER_ERROR 失败
 */
int ring_buffer_read(ring_buffer_t *buffer, uint8_t *data, uint32_t size);

#endif // __RING_BUFFER_H__